home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 2.iso / dist / fw_glimpse.idb / usr / freeware / src / glimpse-3.0 / compress / trecursive.c.z / trecursive.c
C/C++ Source or Header  |  1997-09-09  |  2KB  |  115 lines

  1. /* Copyright (c) 1994 Burra Gopal, Udi Manber.  All Rights Reserved. */
  2.  
  3. #include "autoconf.h"    /* ../libtemplate/include */
  4. #include <stdio.h>
  5. #include <sys/types.h>
  6. #if    ISO_CHAR_SET
  7. #include <locale.h>
  8. #endif
  9.  
  10. #if HAVE_DIRENT_H
  11. # include <dirent.h>
  12. # define NAMLEN(dirent) strlen((dirent)->d_name)
  13. #else
  14. # define dirent direct
  15. # define NAMLEN(dirent) (dirent)->d_namlen
  16. # if HAVE_SYS_NDIR_H
  17. #  include <sys/ndir.h>
  18. # endif
  19. # if HAVE_SYS_DIR_H
  20. #  include <sys/dir.h>
  21. # endif
  22. # if HAVE_NDIR_H
  23. #  include <ndir.h>
  24. # endif
  25. #endif
  26.  
  27. #include <sys/stat.h>
  28. #include <fcntl.h>
  29. #define DIRSIZE 14
  30.  
  31. #ifndef S_ISREG
  32. #define S_ISREG(mode) (0100000&(mode))
  33. #endif
  34.  
  35. #ifndef S_ISDIR
  36. #define S_ISDIR(mode) (0040000&(mode))
  37. #endif
  38.  
  39. #if    0
  40. #define FUNCTION(x, y, z)    treewalk(x, y, z)
  41. #define MAX_LINE_LEN        1024
  42.  
  43. main(argc, argv)
  44. int argc; char **argv;
  45. {
  46.     char buf[MAX_LINE_LEN];
  47.     char outbuf[MAX_LINE_LEN];
  48.     int flags=0;
  49.  
  50. #if    ISO_CHAR_SET
  51.     setlocale(LC_ALL, "");
  52. #endif
  53.     if (argc == 1) {
  54.         strcpy(buf, ".");
  55.         return treewalk(buf, outbuf, flags);
  56.     }
  57.     else while(--argc > 0) {
  58.         strcpy(buf, *++argv);
  59.         return treewalk(buf, outbuf, flags);
  60.     }
  61. }
  62.  
  63. int
  64. treewalk(name, outname, flags)
  65. char *name;
  66. char *outname;
  67. int flags;
  68. {
  69.     struct stat stbuf;
  70.     extern int puts();
  71.  
  72.     if(lstat(name, &stbuf) == -1) {
  73.         fprintf(stderr, "permission denied or non-existent: %s\n", name);
  74.         return -1;
  75.     }
  76.     if ((stbuf.st_mode & S_IFMT) == S_IFLNK)
  77.         return -1;
  78.     if ((stbuf.st_mode & S_IFMT) == S_IFDIR) 
  79.         return DIRECTORY(name, outname, flags);
  80.     if ((stbuf.st_mode & S_IFMT) == S_IFREG)
  81.         return puts(name);
  82. }
  83. #endif    /*0*/
  84.  
  85. int
  86. DIRECTORY(name, outname, flags)
  87. char *name, *outname;
  88. int flags;
  89. {
  90.     struct dirent *dp;
  91.     char *nbp;
  92.     DIR *dirp;
  93.  
  94.     nbp = name + strlen(name);
  95.     if( nbp+DIRSIZE+2 >= name+MAX_LINE_LEN ) {    /* name too long */
  96.         fprintf(stderr, "name too long: %.32s...\n", name);
  97.         return -1;
  98.     }
  99.     if((dirp = opendir(name)) == NULL) {
  100.         fprintf(stderr, "permission denied: %s\n", name);
  101.         return -1;
  102.     }
  103.     *nbp++ = '/';
  104.     for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
  105.         if (dp->d_name[0] == '\0' || strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..")==0) {
  106.             continue;
  107.         }
  108.         strcpy(nbp, dp->d_name);
  109.         FUNCTION(name, outname, flags);
  110.     }
  111.     closedir (dirp);
  112.     *--nbp = '\0'; /* restore name */
  113.     return 0;
  114. }
  115.